package com.customer.controller;

import com.customer.pojo.User;
import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

/**
 * hystrix熔断测试
 */
@RestController
// 指定一个类的全局熔断
@DefaultProperties(defaultFallback = "queryUserListFallBack")
public class HystrixController {

    @Autowired
    private RestTemplate restTemplate;

    /**
     * 通过服务名调用
     * @return
     */
    @RequestMapping("/hystrixTest")
    // 用来声明一个降级的逻辑方法
    /*
        我们把FallBack方法写在了某个业务方法上，如果方法很多，就要写多个，所以我们可以把FallBack配置加在
        类上，这样每个方法都可以共享这个熔断方法
        使用：@DefaultProperties(defaultFallback = "queryUserListFallBack")
        defaultFallBack:默认降级方法，不用任何参数，已匹配更多方法，但是返回值要一样
     */
    //@HystrixCommand(fallbackMethod = "queryUserListFallBack") 方法熔断
    @HystrixCommand  // 表示该方法需要熔断处理
    public String eurekaByServiceNameTest(){
        // 通过服务名调用
        String baseUrl = "http://service-provider/findUserAll";
        String users = this.restTemplate.getForObject(baseUrl, String.class);
        return users;
    }

    /**
     * 熔断的降级逻辑方法必须跟正常的逻辑方法保证：相同的参数列表和放回置声明
     * @return
     */
    public String queryUserListFallBack(){
        return "请求繁忙，请稍后再试！";
    }

    /**
     * 通断测试
     * @param id
     * @return
     */
    @RequestMapping("/findOneUser/{id}")
    @HystrixCommand
    public String findOneUser(@PathVariable("id") Integer id){
        /**
         * id == 1已时一定失败，当我们疯狂请求id为1时（超过20次），就会触发熔断，断路器也会断开，一切请求都会
         * 被降级处理，此时访问id为2的请求，会发现返回也是失败的，而且失败时间很短，只有几毫秒左后
         */
        if(id == 1){
            throw new RuntimeException("太忙了！！！");
        }
        // 通过服务名调用
        String baseUrl = "http://service-provider/findOneUser/"+id;
        String user = this.restTemplate.getForObject(baseUrl, String.class);
        return user;
    }
}
